Kubernetes 101 - Kubectl CLI和Pods
译者:张迪
校对:无
Kubernetes 101 - Kubectl CLI and Pods
对于Kubernetes 101,我们将覆盖的内容包括kubectl, pods, volumes, 以及多容器。
为了kubectl使用率示例可以正常运行,请确保你已经在本地有示例目录,可以从https://github.com/kubernetes/kubernetes/releases中或者从https://github.com/kubernetes/kubernetes中得到的。
内容列表
- Kubernetes 101 - Kubectl CLI 和 Pods
- Kubectl CLI
- Pods
- Pod 定义
- Pod 管理
- Volumes
- Volume 类型
- 多容器
- 下面是什么?
Kubectl CLI
同Kubernetes交互的最简单方法是通过kubectl命令行界面
对于kubectl的更多信息,包括它的使用率,命令,参数,请阅读kubectl CLI参考手册http://kubernetes.io/v1.1/docs/user-guide/kubectl/kubectl.html。
如果你没有安装好或者配置好kubectl,在继续阅读之前按照http://kubernetes.io/v1.1/docs/user-guide/prereqs.html把预置条件完成。
Pods
在Kubernetes,一组单个或者多个容器叫做pod。Pod中的容器是部署在一起的,并且作为一组来启动,停止和复制。
点击pods链接http://kubernetes.io/v1.1/docs/user-guide/pods.html得到更多细节信息。
Pod定义
最简单的pod定义描述了单个容器的部署。比如,一个nginx web服务器的pod可以定义如下: apiVersion: v1 kind: Pod metadata: name: nginx spec: containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Pod的定义声明了某个预期状态。预期状态是Kubernetes模型中非常重要的概念。很多事情在系统中体现为预期状态,而Kubernetes有责任确保当前状态匹配预期状态。举个例子,当你创建一个Pod,你指明其中的容器进入运行。如果容器没有运行(例如程序错误,...),为了驱使容器进入预期状态,Kubernetes将持续为你(再)创建这些容器。这个过程将一直持续到该Pod被删除。
获取更多细节信息,请查阅设计文档http://kubernetes.io/v1.1/docs/design/README.html。
Pod管理
创建一个包含nginx server的pod(pod-nginx.yaml http://kubernetes.io/v1.1/docs/user-guide/walkthrough/pod-nginx.yaml):
$ kubectl create -f docs/user-guide/walkthrough/pod-nginx.yaml
列出所有pods:
$ kubectl get pods
在Pod部署的大部分环境里,Pod的IP都是外部不可见的。最便捷的测试Pod是否工作的方法是创建一个BusyBoxPod并且在上面远程运行命令。请查看可执行命令文档http://kubernetes.io/v1.1/docs/user-guide/kubectl/kubectl_exec.html以找到更多细节。
如果Pod IP可以访问,你应该可以利用curl访问在80端口访问http端点。
$ curl http://$(kubectl get pod nginx -o=template -t={{.status.podIP}})
通过名字删除pod:
$ kubectl delete pod nginx
Volumes
这对于一个简单的静态网站服务器很不错,那么对于需要持续性存储情况如何?
容器文件系统仅仅存在于容器的生存周期。所以,如果你的应用状态需要忍受迁移、重启和崩溃,你需要配置一些持续性存储。
在下面的例子中,我们将创建一个Redis Pod,这个Pod包括一个named Volume和包含Volume安装路径的Volume安装点。
1、定义一个Volume:
volumes:
- name: redis-persistent-storage
emptyDir: {}
- 在容器定义内定义一个Volume安装点
volumeMounts:
# 名字必须与下面的Volume名字一致
- name: redis-persistent-storage
# 容器中的安装点
mountPath: /data/redis
带有持续存储Volume的Redis Pod定义举例(pod-redis.yamlhttp://kubernetes.io/v1.1/docs/user-guide/walkthrough/pod-redis.yaml):
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-persistent-storage
mountPath: /data/redis
volumes:
- name: redis-persistent-storage
emptyDir: {}
案例下载http://kubernetes.io/v1.1/docs/user-guide/walkthrough/pod-redis.yaml
注: •volume安装点名字是一个指向一个特定空目录volume的指针。 •volume安装目录是容器内安装特定空目录volume的路径。
Volume 类型 •EmptyDir:创建一个在容器失效和重启情况下可以持续的新目录 •HostPath:将已经存在的目录安装在节点文件系统上 (e.g. /var/logs).
查阅 volumes http://kubernetes.io/v1.1/docs/user-guide/volumes.html可以得到更多细节。
多容器
注:下面的例子在语义上正确,但是某些镜像(比如 kubernetes/git-monitor)目前还不存在。我们正在努力将这些内容加入到可以工作的例子中。
However, often you want to have two different containers that work together. An example of this would be a web server, and a helper job that polls a git repository for new updates: 然而,通常你会希望存在两种容器在一起工作。一个例子是网站服务器,和一个可以从git仓库中拉出更新的帮助任务。
apiVersion: v1
kind: Pod
metadata:
name: www
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /srv/www
name: www-data
readOnly: true
- name: git-monitor
image: kubernetes/git-monitor
env:
- name: GIT_REPO
value: http://github.com/some/repo.git
volumeMounts:
- mountPath: /data
name: www-data
volumes:
- name: www-data
emptyDir: {}
注意我们也在这里增加了一个volume。在这个例子里,这个volume同时被安装在两个容器中。在网页服务器容器中,由于并不需要写这个目录,因此被标注为只读。
最后,我们也引入了一个给git-monitor容器使用的环境变量,这个变量允许我们将我们希望跟踪的特定git仓库作为参数使用
后续是什么?
继续学习Kubernetes 201http://kubernetes.io/v1.1/docs/user-guide/walkthrough/k8s201.html或者阅读guestbook examplehttp://kubernetes.io/v1.1/examples/guestbook/README.html,这可以得到一个完整的用例。